//
//  main.m
//  06-Date作业
//
//  Created by dllo on 16/7/11.
//  Copyright © 2016年 高雅馨. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    /**
     * 1. 计算当前时间和一个固定时间的差值,如果差值在60秒内,输出"刚刚",如果在60秒外3600秒内,输出"xx分钟前",如果3600秒外, 3600*24秒内,输出"xx小时前"
     2. 将字符串@"2016年04月01日 01点20分18秒"转换为NSDate对象。
     3. 将1468232420转成日期类型
     4. 研究NSDateComponents
     */
    // 1⃣️
    // 固定时间
    NSDate *pastDate = [NSDate dateWithTimeIntervalSinceNow:-1];
    NSLog(@"%@", pastDate);
    // 打印显示的是 格里尼治时间 年-月-日 时:分:秒 + 时区
    // 当前时间
    NSDate *nowDate = [NSDate date];
    // 固定时间与当前时间的差值
    NSTimeInterval interval = [nowDate timeIntervalSinceDate:pastDate];
    NSLog(@"时间差为 %.2f 秒", interval);
    if (interval <= 60) {
        NSLog(@"刚刚");
    } else if(interval <= 3600) {
        NSLog(@"%.f分钟之前", interval / 60);
    } else if(interval <= 24*3600) {
        NSLog(@"%.f小时之前", interval / 3600);
    } else if(interval > 24*3600) {
        NSLog(@"%@", pastDate);
    }
    // 2⃣️
    NSDateFormatter *exFormat = [[NSDateFormatter alloc] init];
    [exFormat setDateFormat:@"yyyy年MM月dd日 HH点mm分ss秒"];
    // 准备时间字符串
    NSString *timeStr = @"2016年04月01日 01点20分18秒";
    // 使用时间格式对象借助时间字符串格式化时间对象
    NSDate *dateStr = [[exFormat dateFromString:timeStr] dateByAddingTimeInterval:[NSTimeZone localTimeZone].secondsFromGMT];
    NSLog(@"timeStrDate: %@", dateStr);
    // 如果想得到北京时间需要手动加上8小时
    NSDate *date2 = [dateStr dateByAddingTimeInterval:8*60*60];
    NSLog(@"%@", date2);
    // 3⃣️ 毫秒值 还可以使用dateWithTimeIntervalSinceNow或者dateWithTimeIntervalSinceReferenceDate
    long long time = 1468232420LL;
    NSDate *d = [[NSDate alloc]initWithTimeIntervalSince1970:time/1000.0];
    NSLog(@"%@", d);
    // 4⃣️
    /**
     *  NSDateFormatter调整时间格式的代码
     在开发iOS程序时，有时候需要将时间格式调整成自己希望的格式，这个时候我们可以用NSDateFormatter类来处理。
     例如：
     //实例化一个NSDateFormatter对象
     NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
     //设定时间格式,这里可以设置成自己需要的格式
     [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
     //用[NSDate date]可以获取系统当前时间
     NSString *currentDateStr = [dateFormatter stringFromDate:[NSDate date]];
     //输出格式为：2010-10-27 10:22:13
     NSLog(@”%@”,currentDateStr);
     //alloc后对不使用的对象别忘了release
     [dateFormatter release];
     
     NSDateComponents
     NSDateComponents封装在一个可扩展的，面向对象的方式的日期组件。它是用来弥补时间的日期和时间组件提供一个指定日期：小时，分钟，秒，日，月，年，等等。它也可以用来指定的时间，例如，5小时16分钟。一个NSDateComponents对象不需要定义所有组件领域。当一个NSDateComponents的新实例被创建，日期组件被设置为NSUndefinedDateComponent。
     一个NSDateComponents对象本身是毫无意义的;你需要知道它是针对什么日历解释，你需要知道它的值是否是正整数和值是多少。
     NSDateComponents的实例不负责回答关于一个日期以外的信息，它是需要先初始化的。例如，如果你初始化一个对象为2004年5月6日，其星期几NSUndefinedDateComponent，不是星期四。要得到正确的星期几，你必须创建一个NSCalendar日历实例，创建一个NSDate对象并使用dateFromComponents：方法，然后使用components:fromDate:检索平周几
     获取一个NSDateComponents对象的信息
     – era 时代
     – year 年
     – month 月
     – day 天
     – hour 时
     – minute 分
     – second 秒
     – week
     – weekday
     – weekdayOrdinal
     – quarter 季度
     设置一个NSDateComponents对象的信息
     – setEra:
     – setYear:
     – setMonth:
     – setDay:
     – setHour:
     – setMinute:
     – setSecond:
     – setWeek:
     – setWeekday:
     – setWeekdayOrdinal:
     – setQuarter:
     */
    // 例子如下：获得2004年5月6日是星期几
    NSDateComponents *comps = [[NSDateComponents alloc] init];
    [comps setDay:6];
    [comps setMonth:5];
    [comps setYear:2004];
    NSCalendar *gregorian = [[NSCalendar alloc]initWithCalendarIdentifier:NSGregorianCalendar];
    NSDate *date = [gregorian dateFromComponents:comps];
    NSDateComponents *weekdayComponents = [gregorian components:NSWeekdayCalendarUnit fromDate:date];
    int weekday = (int)[weekdayComponents weekday];
    NSLog(@"%d",weekday);
    return 0;
}